What is the Optimal Method to Mine in Minecraft

To answer this question we must first collect data. To do this I created a minecraft mod that randomly teleports the player, samples a 500x50x500 (X,Y,Z) set of blocks around the player and logs those blocks into a csv. It repeats this a total of 10 times creating 10 samples of 500x50x500 blocks

The mod can be seen here: https://github.com/JPrier/MinecraftBlocksDistribution

Data

Here we will use Pandas to read in the data to be used to visualize distributions.

import pandas as pd
import plotly.express as px
from IPython.display import HTML

Visualize Distributions

Here we want to visualize the blocks and their frequency

# Get blocks that we care about
importantBlocks = ['coal_ore', 'gold_ore', 'iron_ore', 'diamond_ore', 'lapis_ore', 'redstone_ore', 'emerald_ore']
df_blocks = df.loc[df['Block'].isin(importantBlocks)]
# Create distribution plots of block vs Y level

fig = px.histogram(df_blocks, x="Y", color="Block")
# HTML(fig.to_html(include_plotlyjs='cdn'))
 
# HeatMaps of blocks

# adjust samples to be same distance from player
df_blocks["XFromPlayer"] = (df_blocks["playerX"] - df_blocks["X"]).abs()
df_blocks["ZFromPlayer"] = (df_blocks["playerZ"] - df_blocks["Z"]).abs()

df_emerald = df_blocks.loc[df_blocks['Block'] == 'emerald_ore']

fig = px.density_heatmap(df_blocks, x="XFromPlayer", y="Y")
 
fig = px.scatter_3d(df_blocks, x='XFromPlayer', y='Y', z='ZFromPlayer', color='Block')
HTML(fig.to_html(include_plotlyjs='cdn'))

What is the best method

Now that we have the data and have seen the distributions of blocks through our samples lets see how different methods of mining do.

Calculating the best method

We will compare each of the methods based on these data points:

  • Number of blocks mined
  • Number of desired blocks mined

TODO (What to figure out)

  • Should methods be done on every level and each be compared?
  • If a player sees diamonds they will mine all of them, need to grab all visible ore
# Starting from the player calculate each of the methods at different starting levels. save each into a dataframe
def strip_mining():
    # +250X @ Y, Y+1, -250X @ Y, Y+1 -- repeat for +2Z, -2Z
    # 
    # Get range of coords. Should be an O(1) process by just selecting a set of blocks from coords given the player's starting location
    #
    # Create tuples [X, Y, Z] and get the blocks at those coords. Need to also grab all "visible" blocks (need a method to "mine")
    #
    #
    # Strip 1 xRange = [0, 250], yRange = [0, 1], zRange = [0]
    # repeat each 3 Z s.t. there are 2 blocks in between strips
    # Need zRange = [0, 3, 6, 9, ..., Z<=250]
    pass
    
# Calculate the frequency of blocks seen with each method at different levels
# Show the "Scores"